package scutse.qixuan.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.commons.io.IOUtils;

/**一些基本工具，用于通过URL，爬取web数据
 * @author Qixuan
 *
 */
public class GetURL {

	
	
	
	
	
	
	/**通过给定一个url地址，获取该地址的全部字符串
	 * @param urlstr url地址（String）
	 * @return url内容字符串
	 */
	public static String getString(String urlstr){
		try {
			return getString(new URL(urlstr));
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	
	/**通过给定一个url地址，获取该地址的全部字符串
	 * @param url url地址
	 * @return url内容字符串
	 */
	public static String getString(URL url){
		HttpClient httpClient = new HttpClient();
		// 设置 Http 连接超时为5秒
		httpClient.getHttpConnectionManager().getParams()
				.setConnectionTimeout(5000);

		// 生成 GetMethod 对象并设置参数 
		GetMethod getMethod = new GetMethod("http://www.baidu.com/");
		// 设置 get 请求超时为 5 秒
		getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 5000);
		// 设置请求重试处理，用的是默认的重试处理：请求三次
		getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
				new DefaultHttpMethodRetryHandler());

		/* 3 执行 HTTP GET 请求 */
		try {
			int statusCode = httpClient.executeMethod(getMethod);
			/* 4 判断访问的状态码 */
			if (statusCode != HttpStatus.SC_OK) {
				System.err.println("Method failed: "
						+ getMethod.getStatusLine());
			}

			/* 5 处理 HTTP 响应内容 */
			// HTTP响应头部信息，这里简单打印
			Header[] headers = getMethod.getResponseHeaders();
			for (Header h : headers)
				System.out.println(h.getName() + " " + h.getValue());
			// 读取 HTTP 响应内容，这里简单打印网页内容
			byte[] responseBody = getMethod.getResponseBody();// 读取为字节数组
			
			// 读取为 InputStream，在网页内容数据量大时候推荐使用
			InputStream response = getMethod.getResponseBodyAsStream();//
			
			return new String(responseBody);
			
		} catch (HttpException e) {
			// 发生致命的异常，可能是协议不对或者返回的内容有问题
			System.out.println("Please check your provided http address!");
			e.printStackTrace();
		} catch (IOException e) {
			// 发生网络异常
			e.printStackTrace();
		} finally {
			/* 6 .释放连接 */
			getMethod.releaseConnection();
		}
		return null;
		
	}
	
	
	/**通过给定一个url地址，获取该地址的字节数组内容，可以获取任意类型资源
	 * @param urlstr url地址（String）
	 * @return 资源的字节数组
	 */
	public static byte[] getBytes(String urlstr){
		try {
			return getBytes(new URL(urlstr));
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	
	/**通过给定一个url地址，获取该地址的字节数组内容，可以获取任意类型资源
	 * @param url url地址
	 * @return 资源的字节数组
	 */
	public static byte[] getBytes(URL url){
		
		try {
			byte[] bytearray = IOUtils.toByteArray(url);
			return bytearray;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
	
}
